import java.awt.EventQueue;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import entities.ImportTmp;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.awt.Color;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;

public class ImportCSVfile {

	private JFrame frame;
	JFileChooser fc;
	JLabel lblUrlArchivo;
	File file;
	JLabel lblExito;
	JLabel lblError;
	JTextArea textArea;
	String encoding = "UTF-16";

	private static SessionFactory factory;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ImportCSVfile window = new ImportCSVfile();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public ImportCSVfile() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 946, 522);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);

		JButton btnBuscarArchivo = new JButton("Buscar Archivo");
		btnBuscarArchivo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int returnVal = fc.showOpenDialog(frame);

				if (returnVal == JFileChooser.APPROVE_OPTION) {
					file = fc.getSelectedFile();
					// This is where a real application would open the file.
					lblUrlArchivo.setSize(frame.getWidth(),
							lblUrlArchivo.getHeight());
					lblUrlArchivo.setText(file.getAbsolutePath());
					cargarArchivo();
				}
			}
		});
		btnBuscarArchivo.setBounds(43, 11, 118, 23);
		// btnBuscarArchivo.addActionListener(this);
		frame.getContentPane().add(btnBuscarArchivo);

		lblUrlArchivo = new JLabel("...");
		lblUrlArchivo.setBackground(Color.WHITE);
		lblUrlArchivo.setBounds(171, 15, 100, 14);

		frame.getContentPane().add(lblUrlArchivo);

		JButton btnImportar = new JButton("Importar a BD");
		btnImportar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				guardarArchivo();
			}
		});
		btnImportar.setBounds(43, 45, 118, 23);
		frame.getContentPane().add(btnImportar);

		lblExito = new JLabel("...");
		lblExito.setBounds(43, 117, 238, 14);
		frame.getContentPane().add(lblExito);

		lblError = new JLabel("...");
		lblError.setBounds(43, 142, 228, 14);
		frame.getContentPane().add(lblError);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 167, 910, 306);
		frame.getContentPane().add(scrollPane);

		textArea = new JTextArea();
		scrollPane.setViewportView(textArea);

		fc = new JFileChooser();

		try {
			factory = new Configuration().configure("config/hibernate.cfg.xml")
					.buildSessionFactory();
		} catch (Throwable ex) {
			System.err.println("Failed to create sessionFactory object." + ex);
			throw new ExceptionInInitializerError(ex);
		}

	}

	private void cargarArchivo() {
		BufferedReader br = null;
		String linea = "";

		try {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(
					file), this.encoding));

			while ((linea = br.readLine()) != null) {
				textArea.append(linea + "\n");
			}
		} catch (FileNotFoundException e) {
			System.out.println("Archivo no encontrado: ");
			e.printStackTrace();
		} catch (IOException ex) {
			System.out.println("No se puede leer el archivo: ");
			ex.printStackTrace();
		} finally {
			if (br != null) {
				try {
					br.close();
				} catch (IOException ex) {
					ex.printStackTrace();
				}
			}
		}
	}

	private void guardarArchivo() {
		BufferedReader br = null;
		String linea = "";
		String[] columnas;

		double doubleTemporal;
		Session session = null;
		Transaction tx = null;

		try {
			session = factory.openSession();

			try {
				// br = new BufferedReader(new FileReader(file));

				br = new BufferedReader(new InputStreamReader(
						new FileInputStream(file), encoding));

				DateFormat formatoFecha = new SimpleDateFormat(
						"dd/mm/yyyy kk:mm:ss");
				DecimalFormat formatoNumerico = new DecimalFormat("0,00");
				formatoNumerico.getDecimalFormatSymbols().setDecimalSeparator(
						',');
				formatoNumerico.getDecimalFormatSymbols().setGroupingSeparator(
						'.');

				br.readLine();// para saltar el encabezado
				int exito = 0;
				int error = 0;
				while ((linea = br.readLine()) != null) {
					ImportTmp tmp = new ImportTmp();
					columnas = linea.split(";");
					try {
						tmp.setFecha(formatoFecha.parse(columnas[0].trim()));

						System.out.println("0 en char= "
								+ columnas[1].charAt(0) + "en byte= "
								+ (byte) columnas[1].charAt(0));
						System.out.println("1 en char= "
								+ columnas[1].charAt(1) + "en byte= "
								+ (byte) columnas[1].charAt(1));
						System.out.println("2 en char= "
								+ columnas[1].charAt(2) + "en byte= "
								+ (byte) columnas[1].charAt(2));

						doubleTemporal = formatoNumerico.parse(
								columnas[1].trim().substring(2)).doubleValue();
						tmp.setMonto(new Double(doubleTemporal));

						doubleTemporal = formatoNumerico.parse(
								columnas[3].trim().substring(2)).doubleValue();
						tmp.setSaldo(new Double(doubleTemporal));

					} catch (ParseException e1) {
						error++;
						System.out
								.println("Error al parsear, Linea no procesada: "
										+ linea);
						System.out.println(e1);
						continue;
					}
					tmp.setCuenta(columnas[2].trim());
					tmp.setCategoria(columnas[4].trim());
					tmp.setDescripcion(columnas[5].trim());
					tmp.setTipo(columnas[6].trim());

					tx = session.beginTransaction();
					try {
						session.save(tmp);
						tx.commit();
						tx = null;
					} finally {
						if (tx != null) {
							tx.rollback();
							tx = null;
						}
					}
					exito++;
				}

				lblExito.setText("Importados con exito: " + exito);
				lblError.setText("No importados: " + error);

			} catch (FileNotFoundException e) {
				System.out.println("Archivo no encontrado: ");
				e.printStackTrace();
			} catch (IOException ex) {
				System.out.println("No se puede leer el archivo: ");
				ex.printStackTrace();
			} finally {
				if (br != null) {
					try {
						br.close();
					} catch (IOException ex) {
						ex.printStackTrace();
					}
				}
			}
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}

	}
}
